iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

RV64IMA_zifencei_zicsr

我們先來盤點一下總共要實作的指令有哪些,以及指令的格式有哪些。

在那之前推薦兩個好用的網站,在後續實作時幫助很大,分別為

  1. RISC-V Instruction Set Specifications
    這個網站包含每個指令的解碼方式及實現方法,我們會以這個網站為標準去實現。
  2. rvcode.js
    這個網站可以輸入一個指令,並告訴我們這個指令是什麼,例如我們以之前的Entry point的那道指令"0x4197"為例,可以看到翻譯出來是auipc x3 4,非常方便。

切回正題,我們的目標是要能開沒有FPU(浮點數),沒有MMU的Linux,根據mini-rv32,我們只要實現IMA指令就可以將Linux開起來,但實際上還需要再額外實現zifence.i及zicsr這兩個擴充。
而RISCV-I指令又可以簡單區分為 ALU指令(運算類),CTRL指令(控制指令流程),LS指令(load and store,記憶體相關),以及其他(enviroment call......),我們統計RVI在32bit下ALU有21道指令,分別為。

指令 行為
lui(load upper immediate) 讀取立即值到暫存內。
auipc(add upper immediate to pc) 讀取一個立即值,加上PC後存回暫存內。
add 將暫存內的值相加後存回暫存內。
addi 將暫存內的值加上一個立即值後存回暫存內。
sub 將暫存內的值相減後存回暫存內。
and 將暫存內的值做邏輯"與"運算後存回暫存內。
andi 將暫存內的值與一個立即值做邏輯"與"運算後存回暫存內。
or 將暫存內的值做邏輯"或"運算後存回暫存內。
ori 將暫存內的值與一個立即值做邏輯"或"運算後存回暫存內。
xor 將暫存內的值做邏輯"互斥或"運算後存回暫存內。
xori 將暫存內的值與一個立即值做邏輯"互斥或"運算後存回暫存內。
sll(shift left logic) 將暫存內的值邏輯左移後存回暫存內。
slli(shift left logic immediate) 將暫存內的值邏輯左移一個立即值後存回暫存內。
srl(shift right logic) 將暫存內的值邏輯右移後存回暫存內。
srli(shift right logic immediate) 將暫存內的值邏輯右移一個立即值後存回暫存內。
sra (shift right arithmetic) 將暫存內的值算數右移後存回暫存內。
srai (shift right arithmetic immediate) 將暫存內的值算數右移一個立即值後存回暫存內。
slt(set less than) 如果暫存A比暫存B小(有號),則設另一暫存為1,反之則設為0。
slti(set less than immediate) 如果暫存A比立即值小,則設另一暫存為1,反之則設為0。
sltu(set less than unsigned) 如果暫存A比暫存B小(無號),則設另一暫存為1,反之則設為0。
sltiu(set less than unsigned immediate) 如果暫存A比立即值小(無號),則設另一暫存為1,反之則設為0。

而64bit則會需要額外支援以下9道指令,皆為64bit下要額外支援以32bit為單位進行操作下的指令。

指令 行為
addw 將暫存內的值相加後,以word(32bit)為單位存回暫存內。
subw 將暫存內的值相減後,以word(32bit)為單位存回暫存內。
addiw 將暫存內的值加上一個立即值後,以word(32bit)為單位存回暫存內。
sllw 將暫存內的值邏輯左移後,以word(32bit)為單位存回暫存內。
slliw 將暫存內的值邏輯左移後,以word(32bit)為單位存回暫存內。
srlw 將暫存內的值邏輯右移後,以word(32bit)為單位存回暫存內。
srliw 將暫存內的值邏輯右移後,以word(32bit)為單位存回暫存內。
sraw 將暫存內的值算數右移後,以word(32bit)為單位存回暫存內。
sraiw 將暫存內的值算數右移一個立即值後,以word(32bit)為單位存回暫存內。

我們可以發現,很多指令的行為是類似的,例如add和addi,區別只是在一個是以暫存內的值相加,另一個是加上立即值。實際上根據行為不同其對應的編碼也會有所不同,例如說要加上立即值的指令,會需要保留較大的空間給立即值使用,而以暫存去儲存值只要有足夠的位元數去儲存暫存器的編號即可,根據這些特點不同,RISC-V指令可簡單分為以下幾種編碼格式。

https://ithelp.ithome.com.tw/upload/images/20231001/20162436oEbkhW4jI4.png
圖源

其中R和I分別對應上述的add, addi等以暫存或以立即值作為輸入的指令,U指的是lui,auipc等需要較多空間儲存立即值的指令,S是store指令的格式,B跟J則是CTRL指令的Branch以及Jump等指令的格式,可以先簡單記憶一下。接下來的兩天會將上述提到的ALU分為R-format及I-format,將這些指令完成,並再花三天將I extension內還未介紹的CTRL指令(控制指令流程),LS指令(load and store,記憶體相關),以及其他指令介紹並實作。


碎碎念 : 想說簡單介紹一下I extension的指令,結果不小心就篇幅太長了。接下來會是比較密集的實作,希望能盡量減少這樣長篇幅都是字的內容。


上一篇
Day 15 - 在開始刻指令之前-RISC-V ISA Test
下一篇
Day 17 RISC-V R-type ALU implement
系列文
從零開始的RISC-V ISA Simulator (Another Little RISC-V ISA Simulator)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言